home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
batch
/
bbb_v21
/
bet.bas
< prev
next >
Wrap
BASIC Source File
|
1991-11-25
|
12KB
|
508 lines
' BET v 1.0 - Brent's Environment Tools
'
' (c) 1991 by Brent Ashley
'
' last revision 25 November 1991
'
' remember to link with _STR$.OBJ under PDQ v3.0
'
' $include: 'pdqdecl.bas'
' use long integers by default
DEFLNG A-Z
TYPE DTAType
Rsvd AS STRING * 21
Attr AS STRING * 1
TimeStamp AS INTEGER
DateStamp AS INTEGER
FileSize AS LONG
FileName AS STRING * 13
END TYPE
DIM ErrorLevel AS INTEGER, Regs AS RegType, DTA AS DTAType
' function to pad a number left with zeros
DEF FNPadL0$(Number,Digits) = RIGHT$(STRING$(Digits,48)+STR$(Number),Digits)
CmdLine$ = COMMAND$
' check for help request or no command line
IF CmdLine$ = "" OR CmdLine$ = "/?" THEN
PRINT
PRINT "BET - Brent's Environment Tools v1.0 by Brent Ashley"
PRINT "Syntax: BET [/D] ResultVar Action [Value1 [Value2...]]
PRINT " or: BET [/D] IS Value1 LT/GT/LE/GE/EQ/NE Value2
PRINT " (returns ERRORLEVEL 255=True 0=False)
PRINT "Where Action is one of:"
PRINT "--- Math actions:"
PRINT " HEX Value1"
PRINT " ADD/SUB/MUL/DIV/MOD Value1 Value2"
PRINT "--- String actions:"
PRINT " LEFT/RIGHT TargetVar Characters"
PRINT " MID TargetVar Startpos Characters"
PRINT " LEN/UPPER/LOWER/LTRIM/RTRIM TargetVar"
PRINT " INSTR TargetVar Text"
PRINT " APPEND Text"
PRINT "--- System info actions:"
PRINT " CPU/VIDEO/COLOR/MACHINEID/NPX/MOUSE/SERIAL/PARALLEL"
PRINT " TIME/HOUR/MINUTE/DATE/WEEKDAY/DAY/MONTH/YEAR"
PRINT " DOSVER/MODE/LINES/CURDRIVE/CURDIR/VALIDDRVS/MEM/EXT"
PRINT " TOGGLE CAP/NUM/INS/SCR [ON/OFF]"
PRINT " VOL DriveLetter"
END
END IF
' work on parent environment
EnvOption 1
Debug = 0
ErrorLevel = 0
' get result variable name
SetDelimitChar 32 ' space
ResultVar$ = UCASE$(PDQParse(CmdLine$))
' check for debug
IF ResultVar$ = "/D" THEN
Debug = -1
ResultVar$ = UCASE$(PDQParse(CmdLine$))
END IF
'
' logical comparisons
'
IF ResultVar$ = "IS" THEN
Value1 = PDQValL(PDQParse(CmdLine$))
Oper$ = UCASE$(PDQParse(CmdLine$))
Value2 = PDQValL(PDQParse(CmdLine$))
SELECT CASE Oper$
CASE "LT"
IF Value1 < Value2 THEN ErrorLevel = 255
CASE "GT"
IF Value1 > Value2 THEN ErrorLevel = 255
CASE "LE"
IF Value1 <= Value2 THEN ErrorLevel = 255
CASE "GE"
IF Value1 >= Value2 THEN ErrorLevel = 255
CASE "EQ"
IF Value1 = Value2 THEN ErrorLevel = 255
CASE "NE"
IF Value1 <> Value2 THEN ErrorLevel = 255
CASE ELSE
PRINT "Invalid IS operator: "; Oper$
ErrorLevel = 1
END SELECT
IF Debug THEN
IF ErrorLevel = 255 THEN PRINT "True" ELSE PRINT "False"
END IF
EndLevel ErrorLevel
END IF
'
' BET Actions
'
Action$ = UCASE$(PDQParse(CmdLine$))
SELECT CASE Action$
'
' Math actions
'
CASE "HEX"
Value1 = PDQValL(PDQParse(CmdLine$))
Result$ = Hex$(Value1)
CASE "ADD"
GOSUB Get2Vals
Result$ = STR$(Value1 + Value2)
CASE "SUB"
GOSUB Get2Vals
Result$ = STR$(Value1 - Value2)
CASE "MUL"
GOSUB Get2Vals
Result$ = STR$(Value1 * Value2)
CASE "DIV"
GOSUB Get2Vals
Result$ = STR$(Value1 \ Value2)
CASE "MOD"
GOSUB Get2Vals
Result$ = STR$(Value1 MOD Value2)
'
' String actions
'
CASE "LEN"
GOSUB GetTargetVar
StrLen = (LEN(ENVIRON$(TargetVar$)))
ErrorLevel = StrLen MOD 256
Result$ = STR$(StrLen)
CASE "INSTR"
GOSUB GetTargetVar
SetDelimitChar 13
Text$ = RTRIM$(PDQParse(CmdLine$))
FOR i% = 1 TO LEN(Text$)
IF MID$(Text$,i%,1) = "~" THEN MID$(Text$,i%,1) = " "
NEXT
Posn = INSTR(ENVIRON$(TargetVar$),Text$)
ErrorLevel = Posn MOD 256
Result$ = STR$(Posn)
CASE "MID"
GOSUB GetTargetVar
StartPos% = PDQValI(PDQParse(CmdLine$))
Chars% = PDQValI(PDQParse(CmdLine$))
Result$ = MID$(ENVIRON$(TargetVar$),StartPos%,Chars%)
CASE "UPPER"
GOSUB GetTargetVar
Result$ = UCASE$(ENVIRON$(TargetVar$))
CASE "LOWER"
GOSUB GetTargetVar
Result$ = LCASE$(ENVIRON$(TargetVar$))
CASE "LEFT"
GOSUB GetTargetVar
Value1% = PDQValI(PDQParse(CmdLine$))
Result$ = LEFT$(ENVIRON$(TargetVar$),Value1%)
CASE "RIGHT"
GOSUB GetTargetVar
Value1% = PDQValI(PDQParse(CmdLine$))
Result$ = RIGHT$(ENVIRON$(TargetVar$),Value1%)
CASE "LTRIM"
GOSUB GetTargetVar
Result$ = LTRIM$(ENVIRON$(TargetVar$))
CASE "RTRIM"
GOSUB GetTargetVar
Result$ = RTRIM$(ENVIRON$(TargetVar$))
CASE "APPEND"
SetDelimitChar 13
Original$ = ENVIRON$(ResultVar$)
Text$ = PDQParse(CmdLine$)
Result$ = Original$ + Text$
'
' System Info actions
'
CASE "CPU"
Result$ = STR$(GetCpu)
SELECT CASE Result$
CASE "86"
ErrorLevel = 1
CASE "286"
ErrorLevel = 2
CASE "386"
ErrorLevel = 3
END SELECT
CASE "VIDEO"
SELECT CASE PDQMonitor
CASE 1
ErrorLevel = 1
Result$ = "Monochrome"
CASE 2
ErrorLevel = 2
Result$ = "Hercules"
CASE 3
ErrorLevel = 3
Result$ = "CGA"
CASE 4, 5, 10
ErrorLevel = 4
Result$ = "EGA"
CASE 6, 7
ErrorLevel = 5
Result$ = "VGA"
CASE 8, 9
ErrorLevel = 6
Result$ = "MCGA"
CASE 11
ErrorLevel = 7
Result$ = "8514/A"
END SELECT
CASE "COLOR"
SELECT CASE PDQMonitor
CASE 1, 2, 4, 6, 8
Result$ = "NO"
CASE ELSE
Result$ = "YES"
ErrorLevel = 255
END SELECT
CASE "MACHINEID"
DEF SEG = &HF000
ErrorLevel = PEEK(&HFFFE)
Result$ = HEX$(ErrorLevel)
CASE "NPX"
Result$ = "NO"
DEF SEG = 0
IF (PEEK(&H410) AND 2) = 2 THEN
ERRORLEVEL = 255
Result$ = "YES"
END IF
CASE "MOUSE"
Regs.AX = 0
Interrupt &H33, Regs
IF Regs.AX <> 0 Then
Result$ = "YES"
ErrorLevel = 255
ELSE
Result$ = "NO"
END IF
CASE "SERIAL"
DEF SEG = 0
ErrorLevel = (PEEK(&H411) AND 14)\2
Result$ = STR$(ErrorLevel)
CASE "PARALLEL"
DEF SEG = 0
ErrorLevel = (PEEK(&H411) AND 192)\64
Result$ = STR$(ErrorLevel)
CASE "TIME"
GOSUB GetTime
IF Hour\12 > 0 THEN AMPM$ = "pm" ELSE AMPM$ = "am"
Hour12 = Hour MOD 12
IF Hour12 = 0 THEN Hour12 = 12
Result$ = STR$(Hour12) + ":" + STR$(Minute) + AMPM$
CASE "HOUR"
GOSUB GetTime
ErrorLevel = Hour
Result$ = STR$(ErrorLevel)
CASE "MINUTE"
GOSUB GetTime
ErrorLevel = Minute
Result$ = Str$(ErrorLevel)
CASE "DATE"
GOSUB GetDate
Result$=FNPadL0$(Month,2)+"/"+FnPadL0$(Day,2)+"/"+FnPadL0$(Year MOD 100,2)
CASE "WEEKDAY"
GOSUB GetDate
ErrorLevel = WeekDay
SELECT CASE WeekDay
CASE 0
Result$ = "Sunday"
CASE 1
Result$ = "Monday"
CASE 2
Result$ = "Tuesday"
CASE 3
Result$ = "Wednesday"
CASE 4
Result$ = "Thursday"
CASE 5
Result$ = "Friday"
CASE 6
Result$ = "Saturday"
END SELECT
CASE "DAY"
GOSUB GetDate
ErrorLevel = Day%
Result$ = STR$(Day%)
CASE "MONTH"
GOSUB GetDate
ErrorLevel = Month%
SELECT CASE Month%
CASE 1
Result$ = "January"
CASE 2
Result$ = "February"
CASE 3
Result$ = "March"
CASE 4
Result$ = "April"
CASE 5
Result$ = "May"
CASE 6
Result$ = "June"
CASE 7
Result$ = "July"
CASE 8
Result$ = "August"
CASE 9
Result$ = "September"
CASE 10
Result$ = "October"
CASE 11
Result$ = "November"
CASE 12
Result$ = "December"
END SELECT
CASE "YEAR"
GOSUB GetDate
ErrorLevel = Year% MOD 100
Result$ = STR$(Year%)
CASE "DOSVER"
DV = DOSVer
ErrorLevel = DV \ 10
Result$ = STR$(DV \ 100) + "." + STR$(DV MOD 100)
CASE "MODE"
Regs.AX = &H0F00
Interrupt &H10, Regs
ErrorLevel = Regs.AX MOD 256
Result$ = STR$(ErrorLevel)
CASE "LINES"
DEF SEG = 0
ErrorLevel = PEEK(&H484) + 1
Result$ = STR$(ErrorLevel)
CASE "CURDRIVE"
Regs.AX = &H1900
Interrupt &H21, Regs
ErrorLevel = Regs.AX MOD 256 + 1
Result$ = CHR$(64 + ErrorLevel)
CASE "CURDIR"
Buffer$ = SPACE$(64)
Regs.AX = &H4700
Regs.DX = 0
Regs.DS = VARSEG(Buffer$)
Regs.SI = SADD(Buffer$)
Interrupt &H21, Regs
Result$ = "\"
NullPos% = INSTR(Buffer$,CHR$(0))
IF NullPos% > 1 THEN Result$ = Result$ + LEFT$(Buffer$,NullPos% - 1)
CASE "VALIDDRVS"
DIM DummyFCB AS STRING * 43
Result$ = ""
FOR i% = 65 TO 90
Drive$ = CHR$(i%) + ": "
Regs.AX = &H2906
Regs.DS = VARSEG(Drive$)
Regs.SI = SADD(Drive$)
Regs.ES = VARSEG(DummyFCB)
Regs.DI = VARPTR(DummyFCB) + 7
Interrupt &H21, Regs
IF (Regs.AX AND 255) <> 255 THEN Result$ = Result$ + CHR$(i%)
NEXT
CASE "VOL"
DriveLetter$ = LEFT$(PDQParse$(CmdLine$),1)
' Set DTA
Regs.AX = &H1A00
Regs.DS = VARSEG(DTA)
Regs.DX = VARPTR(DTA)
Interrupt &H21, Regs
' Get Label
Label$ = DriveLetter$ + ":\*.*" + CHR$(0)
Regs.AX = &H4E00
Regs.DS = VARSEG(Label$)
Regs.DX = SADD(Label$)
Regs.CX = 8
Interrupt &H21, Regs
Label$ = DTA.FileName
' remove dot
DotPos% = INSTR(Label$,".")
IF DotPos% > 0 THEN
Label$=LEFT$(Label$,DotPos%-1)+RIGHT$(Label$,LEN(Label$)-DotPos%)
ENDIF
Result$ = Label$
CASE "MEM"
DEF SEG = 0
Memory = PEEK(&H413) + 256 * PEEK(&H414)
Result$ = STR$(Memory)
CASE "EXT"
Regs.AX = &H8800
Interrupt &H15, Regs
Memory% = Regs.AX
Result$ = STR$(Memory%)
CASE "TOGGLE"
SELECT CASE UCASE$(PDQParse(CmdLine$))
CASE "INS"
Mask = 128
CASE "CAP"
Mask = 64
CASE "NUM"
Mask = 32
CASE "SCR"
Mask = 16
CASE ELSE
PRINT "BET - no toggle specified"
EndLevel 1
END SELECT
DEF SEG = 0
Kbd = &H417
SELECT CASE UCASE$(PDQParse(CmdLine$))
CASE "ON"
POKE Kbd, PEEK(Kbd) OR Mask
ResultVar$ = "DUMMY"
CASE "OFF"
POKE Kbd, PEEK(Kbd) AND (255 - Mask)
ResultVar$ = "DUMMY"
CASE ELSE
IF PEEK(Kbd) AND Mask THEN
Result$ = "YES"
ErrorLevel = 255
ELSE
Result$ = "NO"
END IF
END SELECT
CASE ELSE
PRINT "Invalid BET command: "; Action$
ErrorLevel = 1
END SELECT
IF Debug THEN
PRINT ResultVar$;" : "; Result$
PRINT "ErrorLevel : "; ErrorLevel
ENDIF
IF ResultVar$ <> "DUMMY" THEN
ENVIRON ResultVar$ + "=" + Result$
END IF
EndLevel ErrorLevel
'
' Subroutines
'
Get2Vals:
Value1 = PDQValL(PDQParse(CmdLine$))
Value2 = PDQValL(PDQParse(CmdLine$))
RETURN
GetTargetVar:
TargetVar$ = UCASE$(PDQParse(CmdLine$))
RETURN
GetTime:
Regs.AX = &H2C00
Interrupt &H21, Regs
Hour = Regs.CX \ 256
Minute = Regs.CX MOD 256
RETURN
GetDate:
Regs.AX = &H2A00
Interrupt &H21, Regs
Year% = Regs.CX
Month% = Regs.DX \ 256
Day% = Regs.DX MOD 256
WeekDay% = Regs.AX MOD 7
RETURN